pintobyte rngit
xous-core/kernel/src/debug/gdb/disasm.rs main (17e4bce8) Text, 163.57 KB
pub type RvInst = u64;
#[derive(Clone, Copy, PartialEq)]
#[allow(dead_code)]
pub enum RvIsa {
Rv32 = 0,
Rv64 = 1,
Rv128 = 2,
}
pub type RwFenceType = u8;
pub const RV_FENCE_W: RwFenceType = 1;
pub const RV_FENCE_R: RwFenceType = 2;
pub const RV_FENCE_O: RwFenceType = 4;
pub const RV_FENCE_I: RwFenceType = 8;
pub const RV_IREG_SP: u8 = 2;
pub const RV_IREG_RA: u8 = 1;
pub const RV_IREG_ZERO: u8 = 0;
pub type RvcConstraint = u32;
pub const RVC_CSR_EQ_0XC82: RvcConstraint = 18;
pub const RVC_CSR_EQ_0XC81: RvcConstraint = 17;
pub const RVC_CSR_EQ_0XC80: RvcConstraint = 16;
pub const RVC_CSR_EQ_0XC02: RvcConstraint = 15;
pub const RVC_CSR_EQ_0XC01: RvcConstraint = 14;
pub const RVC_CSR_EQ_0XC00: RvcConstraint = 13;
pub const RVC_CSR_EQ_0X003: RvcConstraint = 12;
pub const RVC_CSR_EQ_0X002: RvcConstraint = 11;
pub const RVC_CSR_EQ_0X001: RvcConstraint = 10;
pub const RVC_IMM_EQ_P1: RvcConstraint = 9;
pub const RVC_IMM_EQ_N1: RvcConstraint = 8;
pub const RVC_IMM_EQ_ZERO: RvcConstraint = 7;
pub const RVC_IMM_EQ_RA: RvcConstraint = 6;
pub const RVC_RS2_EQ_RS1: RvcConstraint = 5;
pub const RVC_RS2_EQ_X0: RvcConstraint = 4;
pub const RVC_RS1_EQ_X0: RvcConstraint = 3;
pub const RVC_RD_EQ_X0: RvcConstraint = 2;
pub const RVC_RD_EQ_RA: RvcConstraint = 1;
pub type RvCodec = u8;
pub const RV_CODEC_RSS_SQSP: RvCodec = 47;
pub const RV_CODEC_CSS_SDSP: RvCodec = 46;
pub const RV_CODEC_CSS_SWSP: RvCodec = 45;
pub const RV_CODEC_CS_SQ: RvCodec = 44;
pub const RV_CODEC_CS_SD: RvCodec = 43;
pub const RV_CODEC_CS_SW: RvCodec = 42;
pub const RV_CODEC_CS: RvCodec = 41;
pub const RV_CODEC_CR_JR: RvCodec = 40;
pub const RV_CODEC_CR_JALR: RvCodec = 39;
pub const RV_CODEC_CR_MV: RvCodec = 38;
pub const RV_CODEC_CR: RvCodec = 37;
pub const RV_CODEC_CL_LQ: RvCodec = 36;
pub const RV_CODEC_CL_LD: RvCodec = 35;
pub const RV_CODEC_CL_LW: RvCodec = 34;
pub const RV_CODEC_CJ_JAL: RvCodec = 33;
pub const RV_CODEC_CJ: RvCodec = 32;
pub const RV_CODEC_CIW_4SPN: RvCodec = 31;
pub const RV_CODEC_CI_NONE: RvCodec = 30;
pub const RV_CODEC_CI_LUI: RvCodec = 29;
pub const RV_CODEC_CI_LI: RvCodec = 28;
pub const RV_CODEC_CI_LQSP: RvCodec = 27;
pub const RV_CODEC_CI_LDSP: RvCodec = 26;
pub const RV_CODEC_CI_LWSP: RvCodec = 25;
pub const RV_CODEC_CI_16SP: RvCodec = 24;
pub const RV_CODEC_CI_SH6: RvCodec = 23;
pub const RV_CODEC_CI: RvCodec = 21;
pub const RV_CODEC_CB_SH6: RvCodec = 20;
pub const RV_CODEC_CB_IMM: RvCodec = 18;
pub const RV_CODEC_CB: RvCodec = 17;
pub const RV_CODEC_R_F: RvCodec = 16;
pub const RV_CODEC_R_L: RvCodec = 15;
pub const RV_CODEC_R_A: RvCodec = 14;
pub const RV_CODEC_R4_M: RvCodec = 13;
pub const RV_CODEC_R_M: RvCodec = 12;
pub const RV_CODEC_R: RvCodec = 11;
pub const RV_CODEC_SB: RvCodec = 10;
pub const RV_CODEC_S: RvCodec = 9;
pub const RV_CODEC_I_CSR: RvCodec = 8;
pub const RV_CODEC_I_SH7: RvCodec = 7;
pub const RV_CODEC_I_SH6: RvCodec = 6;
pub const RV_CODEC_I_SH5: RvCodec = 5;
pub const RV_CODEC_I: RvCodec = 4;
pub const RV_CODEC_UJ: RvCodec = 3;
pub const RV_CODEC_U: RvCodec = 2;
pub const RV_CODEC_NONE: RvCodec = 1;
pub const RV_CODEC_ILLEGAL: RvCodec = 0;
#[derive(Clone, Copy)]
#[repr(usize)]
enum RvOp {
Illegal,
Lui,
Auipc,
Jal,
Jalr,
Beq,
Bne,
Blt,
Bge,
Bltu,
Bgeu,
Lb,
Lh,
Lw,
Lbu,
Lhu,
Sb,
Sh,
Sw,
Addi,
Slti,
Sltiu,
Xori,
Ori,
Andi,
Slli,
Srli,
Srai,
Add,
Sub,
Sll,
Slt,
Sltu,
Xor,
Srl,
Sra,
Or,
And,
Fence,
FenceI,
Lwu,
Ld,
Sd,
Addiw,
Slliw,
Srliw,
Sraiw,
Addw,
Subw,
Sllw,
Srlw,
Sraw,
Ldu,
Lq,
Sq,
Addid,
Sllid,
Srlid,
Sraid,
Addd,
Subd,
Slld,
Srld,
Srad,
Mul,
Mulh,
Mulhsu,
Mulhu,
Div,
Divu,
Rem,
Remu,
Mulw,
Divw,
Divuw,
Remw,
Remuw,
Muld,
Divd,
Divud,
Remd,
Remud,
LrW,
ScW,
AmoswapW,
AmoaddW,
AmoxorW,
AmoorW,
AmoandW,
AmominW,
AmomaxW,
AmominuW,
AmomaxuW,
LrD,
ScD,
AmoswapD,
AmoaddD,
AmoxorD,
AmoorD,
AmoandD,
AmominD,
AmomaxD,
AmominuD,
AmomaxuD,
LrQ,
ScQ,
AmoswapQ,
AmoaddQ,
AmoxorQ,
AmoorQ,
AmoandQ,
AmominQ,
AmomaxQ,
AmominuQ,
AmomaxuQ,
Ecall,
Ebreak,
Uret,
Sret,
Hret,
Mret,
Dret,
SfenceVm,
SfenceVma,
Wfi,
Csrrw,
Csrrs,
Csrrc,
Csrrwi,
Csrrsi,
Csrrci,
Flw,
Fsw,
FmaddS,
FmsubS,
FnmsubS,
FnmaddS,
FaddS,
FsubS,
FmulS,
FdivS,
FsgnjS,
FsgnjnS,
FsgnjxS,
FminS,
FmaxS,
FsqrtS,
FleS,
FltS,
FeqS,
FcvtWS,
FcvtWuS,
FcvtSW,
FcvtSWu,
FmvXS,
FclassS,
FmvSX,
FcvtLS,
FcvtLuS,
FcvtSL,
FcvtSLu,
Fld,
Fsd,
FmaddD,
FmsubD,
FnmsubD,
FnmaddD,
FaddD,
FsubD,
FmulD,
FdivD,
FsgnjD,
FsgnjnD,
FsgnjxD,
FminD,
FmaxD,
FcvtSD,
FcvtDS,
FsqrtD,
FleD,
FltD,
FeqD,
FcvtWD,
FcvtWuD,
FcvtDW,
FcvtDWu,
FclassD,
FcvtLD,
FcvtLuD,
FmvXD,
FcvtDL,
FcvtDLu,
FmvDX,
Flq,
Fsq,
FmaddQ,
FmsubQ,
FnmsubQ,
FnmaddQ,
FaddQ,
FsubQ,
FmulQ,
FdivQ,
FsgnjQ,
FsgnjnQ,
FsgnjxQ,
FminQ,
FmaxQ,
FcvtSQ,
FcvtQS,
FcvtDQ,
FcvtQD,
FsqrtQ,
FleQ,
FltQ,
FeqQ,
FcvtWQ,
FcvtWuQ,
FcvtQW,
FcvtQWu,
FclassQ,
FcvtLQ,
FcvtLuQ,
FcvtQL,
FcvtQLu,
FmvXQ,
FmvQX,
CAddi4spn,
CFld,
CLw,
CFlw,
CFsd,
CSw,
CFsw,
CNop,
CAddi,
CJal,
CLi,
CAddi16sp,
CLui,
CSrli,
CSrai,
CAndi,
CSub,
CXor,
COr,
CAnd,
CSubw,
CAddw,
CJ,
CBeqz,
CBnez,
CSlli,
CFldsp,
CLwsp,
CFlwsp,
CJr,
CMv,
CEbreak,
CJalr,
CAdd,
CFsdsp,
CSwsp,
CFswsp,
CLd,
CSd,
CAddiw,
CLdsp,
CSdsp,
CLq,
CSq,
CLqsp,
CSqsp,
Nop,
Mv,
Not,
Neg,
Negw,
SextW,
Seqz,
Snez,
Sltz,
Sgtz,
FmvS,
FabsS,
FnegS,
FmvD,
FabsD,
FnegD,
FmvQ,
FabsQ,
FnegQ,
Beqz,
Bnez,
Blez,
Bgez,
Bltz,
Bgtz,
Ble,
Bleu,
Bgt,
Bgtu,
J,
Ret,
Jr,
Rdcycle,
Rdtime,
Rdinstret,
Rdcycleh,
Rdtimeh,
Rdinstreth,
Frcsr,
Frrm,
Frflags,
Fscsr,
Fsrm,
Fsflags,
Fsrmi,
Fsflagsi,
}
impl Default for RvOp {
fn default() -> Self {
Self::Ldu
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct RvDecode {
pc: u64,
inst: u64,
imm: i32,
op: RvOp,
codec: u8,
rd: u8,
rs1: u8,
rs2: u8,
rs3: u8,
rm: u8,
pred: u8,
succ: u8,
aq: u8,
rl: u8,
}
#[derive(Copy, Clone)]
pub struct RvOpcodeData {
name: &'static str,
codec: RvCodec,
format: &'static [u8],
pseudo: &'static [RvCompData],
decomp_rv32: Option<RvOp>,
decomp_rv64: Option<RvOp>,
decomp_rv128: Option<RvOp>,
decomp_data: RvCdImmediate,
}
#[derive(Copy, Clone)]
pub struct RvCompData {
op: RvOp,
constraints: &'static [RvcConstraint],
}
#[derive(PartialEq, Copy, Clone)]
enum RvCdImmediate {
None,
Nz,
NzHint,
}
const RV_IREG_NAME_SYM: &[&str] = &[
"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4",
"a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4",
"t5", "t6",
];
const RV_FREG_NAME_SYM: &[&str] = &[
"ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", "fs0", "fs1", "fa0", "fa1", "fa2",
"fa3", "fa4", "fa5", "fa6", "fa7", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9",
"fs10", "fs11", "ft8", "ft9", "ft10", "ft11",
];
const RV_FMT_NONE: &[u8] = b"O\\t";
const RV_FMT_RS1: &[u8] = b"O\\t1";
const RV_FMT_OFFSET: &[u8] = b"O\\to";
const RV_FMT_PRED_SUCC: &[u8] = b"O\\tp,s";
const RV_FMT_RS1_RS2: &[u8] = b"O\\t1,2";
const RV_FMT_RD_IMM: &[u8] = b"O\\t0,i";
const RD_FMT_RD_OFFSET: &[u8] = b"O\\t0,o";
const RV_FMT_RD_RS1_RS2: &[u8] = b"O\\t0,1,2";
const RV_FMT_FRD_RS1: &[u8] = b"O\\t3,1";
const RV_FMT_RD_FRS1: &[u8] = b"O\\t0,4";
const RV_FMT_RD_FRS1_FRS2: &[u8] = b"O\\t0,4,5";
const RV_FMT_FRD_FRS1_FRS2: &[u8] = b"O\\t3,4,5";
const RV_FMT_RM_FRD_FRS1: &[u8] = b"O\\tr,3,4";
const RV_FMT_RM_FRD_RS1: &[u8] = b"O\\tr,3,1";
const RV_FMT_RM_RD_FRS1: &[u8] = b"O\\tr,0,4";
const RV_FMT_RM_FRD_FRS1_FRS2: &[u8] = b"O\\tr,3,4,5";
const RV_FMT_RM_FRD_FRS1_FRS2_FRS3: &[u8] = b"O\\tr,3,4,5,6";
const RV_FMT_RD_RS1_IMM: &[u8] = b"O\\t0,1,i";
const RV_FMT_RD_RS1_OFFSET: &[u8] = b"O\\t0,1,i";
const RV_FMT_RD_OFFSET_RS1: &[u8] = b"O\\t0,i(1)";
const RV_FMT_FRD_OFFSET_RS1: &[u8] = b"O\\t3,i(1)";
const RV_FMT_RD_CSR_RS1: &[u8] = b"O\\t0,c,1";
const RV_FMT_RD_CSR_ZIMM: &[u8] = b"O\\t0,c,7";
const RV_FMT_RS2_OFFSET_RS1: &[u8] = b"O\\t2,i(1)";
const RV_FMT_FRS2_OFFSET_RS1: &[u8] = b"O\\t5,i(1)";
const RV_FMT_RS1_RS2_OFFSET: &[u8] = b"O\\t1,2,o";
const RV_FMT_RS2_RS1_OFFSET: &[u8] = b"O\\t2,1,o";
const RV_FMT_AQRL_RD_RS2_RS1: &[u8] = b"OAR\\t0,2,(1)";
const RV_FMT_AQRL_RD_RS1: &[u8] = b"OAR\\t0,(1)";
const RV_FMT_RD: &[u8] = b"O\\t0";
const RV_FMT_RD_ZIMM: &[u8] = b"O\\t0,7";
const RV_FMT_RD_RS1: &[u8] = b"O\\t0,1";
const RV_FMT_RD_RS2: &[u8] = b"O\\t0,2";
const RV_FMT_RS1_OFFSET: &[u8] = b"O\\t1,o";
const RV_FMT_RS2_OFFSET: &[u8] = b"O\\t2,o";
const RVCC_IMM_EQ_ZERO: [RvcConstraint; 1] = [RVC_IMM_EQ_ZERO];
const RVCC_IMM_EQ_N1: [RvcConstraint; 1] = [RVC_IMM_EQ_N1];
const RVCC_IMM_EQ_P1: [RvcConstraint; 1] = [RVC_IMM_EQ_P1];
const RVCC_RS1_EQ_X0: [RvcConstraint; 1] = [RVC_RS1_EQ_X0];
const RVCC_RS2_EQ_X0: [RvcConstraint; 1] = [RVC_RS2_EQ_X0];
const RVCC_RS2_EQ_RS1: [RvcConstraint; 1] = [RVC_RS2_EQ_RS1];
const RVCC_JAL_J: [RvcConstraint; 1] = [RVC_RD_EQ_X0];
const RVCC_JAL_JAL: [RvcConstraint; 1] = [RVC_RD_EQ_RA];
const RVCC_JALR_JR: [RvcConstraint; 2] = [RVC_RD_EQ_X0, RVC_IMM_EQ_ZERO];
const RVCC_JALR_JALR: [RvcConstraint; 2] = [RVC_RD_EQ_RA, RVC_IMM_EQ_ZERO];
const RVCC_JALR_RET: [RvcConstraint; 2] = [RVC_RD_EQ_X0, RVC_IMM_EQ_RA];
const RVCC_ADDI_NOP: [RvcConstraint; 3] = [RVC_RD_EQ_X0, RVC_RS1_EQ_X0, RVC_IMM_EQ_ZERO];
const RVCC_RDCYCLE: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC00];
const RVCC_RDTIME: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC01];
const RVCC_RDINSTRET: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC02];
const RVCC_RDCYCLEH: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC80];
const RVCC_RDTIMEH: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC81];
const RVCC_RDINSTRETH: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0XC82];
const RVCC_FRCSR: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0X003];
const RVCC_FRRM: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0X002];
const RVCC_FRFLAGS: [RvcConstraint; 2] = [RVC_RS1_EQ_X0, RVC_CSR_EQ_0X001];
const FVCC_FSCSR: [RvcConstraint; 1] = [RVC_CSR_EQ_0X003];
const RVCC_FSRM: [RvcConstraint; 1] = [RVC_CSR_EQ_0X002];
const RVCC_FSFLAGS: [RvcConstraint; 1] = [RVC_CSR_EQ_0X001];
const RVCC_FSRMI: [RvcConstraint; 1] = [RVC_CSR_EQ_0X002];
const RVCC_FSFLAGSI: [RvcConstraint; 1] = [RVC_CSR_EQ_0X001];
const RVCP_JAL: [RvCompData; 2] = [
RvCompData {
op: RvOp::J,
constraints: &RVCC_JAL_J,
},
RvCompData {
op: RvOp::Jal,
constraints: &RVCC_JAL_JAL,
},
];
const RVCP_JALR: [RvCompData; 3] = [
RvCompData {
op: RvOp::Ret,
constraints: &RVCC_JALR_RET,
},
RvCompData {
op: RvOp::Jr,
constraints: &RVCC_JALR_JR,
},
RvCompData {
op: RvOp::Jalr,
constraints: &RVCC_JALR_JALR,
},
];
const RVCP_BEQ: [RvCompData; 1] = [RvCompData {
op: RvOp::Beqz,
constraints: &RVCC_RS2_EQ_X0,
}];
const RVCP_BNE: [RvCompData; 1] = [RvCompData {
op: RvOp::Bnez,
constraints: &RVCC_RS2_EQ_X0,
}];
const RVCP_BLT: [RvCompData; 3] = [
RvCompData {
op: RvOp::Bltz,
constraints: &RVCC_RS2_EQ_X0,
},
RvCompData {
op: RvOp::Bgtz,
constraints: &RVCC_RS1_EQ_X0,
},
RvCompData {
op: RvOp::Bgt,
constraints: &[],
},
];
const RVCP_BGE: [RvCompData; 3] = [
RvCompData {
op: RvOp::Blez,
constraints: &RVCC_RS1_EQ_X0,
},
RvCompData {
op: RvOp::Bgez,
constraints: &RVCC_RS2_EQ_X0,
},
RvCompData {
op: RvOp::Ble,
constraints: &[],
},
];
const RVCP_BLTU: [RvCompData; 1] = [RvCompData {
op: RvOp::Bgtu,
constraints: &[],
}];
const RVCP_BGEU: [RvCompData; 1] = [RvCompData {
op: RvOp::Bleu,
constraints: &[],
}];
const RVCP_ADDI: [RvCompData; 2] = [
RvCompData {
op: RvOp::Nop,
constraints: &RVCC_ADDI_NOP,
},
RvCompData {
op: RvOp::Mv,
constraints: &RVCC_IMM_EQ_ZERO,
},
];
const RVCP_SLTIU: [RvCompData; 1] = [RvCompData {
op: RvOp::Seqz,
constraints: &RVCC_IMM_EQ_P1,
}];
const RVCP_XORI: [RvCompData; 1] = [RvCompData {
op: RvOp::Not,
constraints: &RVCC_IMM_EQ_N1,
}];
const RVCP_SUB: [RvCompData; 1] = [RvCompData {
op: RvOp::Neg,
constraints: &RVCC_RS1_EQ_X0,
}];
const RVCP_SLT: [RvCompData; 2] = [
RvCompData {
op: RvOp::Sltz,
constraints: &RVCC_RS2_EQ_X0,
},
RvCompData {
op: RvOp::Sgtz,
constraints: &RVCC_RS1_EQ_X0,
},
];
const RVCP_SLTU: [RvCompData; 1] = [RvCompData {
op: RvOp::Snez,
constraints: &RVCC_RS1_EQ_X0,
}];
const RVCP_ADDIW: [RvCompData; 1] = [RvCompData {
op: RvOp::SextW,
constraints: &RVCC_IMM_EQ_ZERO,
}];
const RVCP_SUBW: [RvCompData; 1] = [RvCompData {
op: RvOp::Negw,
constraints: &RVCC_RS1_EQ_X0,
}];
const RVCP_CSRRW: [RvCompData; 3] = [
RvCompData {
op: RvOp::Fscsr,
constraints: &FVCC_FSCSR,
},
RvCompData {
op: RvOp::Fsrm,
constraints: &RVCC_FSRM,
},
RvCompData {
op: RvOp::Fsflags,
constraints: &RVCC_FSFLAGS,
},
];
const RVCP_CSRRS: [RvCompData; 9] = [
RvCompData {
op: RvOp::Rdcycle,
constraints: &RVCC_RDCYCLE,
},
RvCompData {
op: RvOp::Rdtime,
constraints: &RVCC_RDTIME,
},
RvCompData {
op: RvOp::Rdinstret,
constraints: &RVCC_RDINSTRET,
},
RvCompData {
op: RvOp::Rdcycleh,
constraints: &RVCC_RDCYCLEH,
},
RvCompData {
op: RvOp::Rdtimeh,
constraints: &RVCC_RDTIMEH,
},
RvCompData {
op: RvOp::Rdinstreth,
constraints: &RVCC_RDINSTRETH,
},
RvCompData {
op: RvOp::Frcsr,
constraints: &RVCC_FRCSR,
},
RvCompData {
op: RvOp::Frrm,
constraints: &RVCC_FRRM,
},
RvCompData {
op: RvOp::Frflags,
constraints: &RVCC_FRFLAGS,
},
];
const RVCP_CSRRWI: [RvCompData; 2] = [
RvCompData {
op: RvOp::Fsrmi,
constraints: &RVCC_FSRMI,
},
RvCompData {
op: RvOp::Fsflagsi,
constraints: &RVCC_FSFLAGSI,
},
];
const RVCP_FSGNJ_S: [RvCompData; 1] = [RvCompData {
op: RvOp::FmvS,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJN_S: [RvCompData; 1] = [RvCompData {
op: RvOp::FnegS,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJX_S: [RvCompData; 1] = [RvCompData {
op: RvOp::FabsS,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJ_D: [RvCompData; 1] = [RvCompData {
op: RvOp::FmvD,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJN_D: [RvCompData; 1] = [RvCompData {
op: RvOp::FnegD,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJX_D: [RvCompData; 1] = [RvCompData {
op: RvOp::FabsD,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJ_Q: [RvCompData; 1] = [RvCompData {
op: RvOp::FmvQ,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJN_Q: [RvCompData; 1] = [RvCompData {
op: RvOp::FnegQ,
constraints: &RVCC_RS2_EQ_RS1,
}];
const RVCP_FSGNJX_Q: [RvCompData; 1] = [RvCompData {
op: RvOp::FabsQ,
constraints: &RVCC_RS2_EQ_RS1,
}];
pub const OPCODE_DATA: [RvOpcodeData; 319] = [
RvOpcodeData {
name: "illegal",
codec: RV_CODEC_ILLEGAL,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lui",
codec: RV_CODEC_U,
format: RV_FMT_RD_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "auipc",
codec: RV_CODEC_U,
format: RD_FMT_RD_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "jal",
codec: RV_CODEC_UJ,
format: RD_FMT_RD_OFFSET,
pseudo: &RVCP_JAL,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "jalr",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_OFFSET,
pseudo: &RVCP_JALR,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "beq",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BEQ,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bne",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BNE,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "blt",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BLT,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bge",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BGE,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bltu",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BLTU,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bgeu",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &RVCP_BGEU,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lb",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lh",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lw",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lbu",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lhu",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sb",
codec: RV_CODEC_S,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sh",
codec: RV_CODEC_S,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sw",
codec: RV_CODEC_S,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "addi",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &RVCP_ADDI,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "slti",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sltiu",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &RVCP_SLTIU,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "xori",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &RVCP_XORI,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ori",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "andi",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "slli",
codec: RV_CODEC_I_SH7,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srli",
codec: RV_CODEC_I_SH7,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srai",
codec: RV_CODEC_I_SH7,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "add",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sub",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &RVCP_SUB,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sll",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "slt",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &RVCP_SLT,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sltu",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &RVCP_SLTU,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "xor",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srl",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sra",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "or",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "and",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fence",
codec: RV_CODEC_R_F,
format: RV_FMT_PRED_SUCC,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fence.i",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lwu",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ld",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sd",
codec: RV_CODEC_S,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "addiw",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &RVCP_ADDIW,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "slliw",
codec: RV_CODEC_I_SH5,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srliw",
codec: RV_CODEC_I_SH5,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sraiw",
codec: RV_CODEC_I_SH5,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "addw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "subw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &RVCP_SUBW,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sllw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srlw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sraw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ldu",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lq",
codec: RV_CODEC_I,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sq",
codec: RV_CODEC_S,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "addid",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sllid",
codec: RV_CODEC_I_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srlid",
codec: RV_CODEC_I_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sraid",
codec: RV_CODEC_I_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "addd",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "subd",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "slld",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srld",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "srad",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mul",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mulh",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mulhsu",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mulhu",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "div",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "divu",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rem",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "remu",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mulw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "divw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "divuw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "remw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "remuw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "muld",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "divd",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "divud",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "remd",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "remud",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lr.w",
codec: RV_CODEC_R_L,
format: RV_FMT_AQRL_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sc.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoswap.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoadd.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoxor.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoor.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoand.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomin.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomax.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amominu.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomaxu.w",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lr.d",
codec: RV_CODEC_R_L,
format: RV_FMT_AQRL_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sc.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoswap.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoadd.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoxor.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoor.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoand.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomin.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomax.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amominu.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomaxu.d",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "lr.q",
codec: RV_CODEC_R_L,
format: RV_FMT_AQRL_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sc.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoswap.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoadd.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoxor.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoor.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amoand.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomin.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomax.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amominu.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "amomaxu.q",
codec: RV_CODEC_R_A,
format: RV_FMT_AQRL_RD_RS2_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ecall",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ebreak",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "uret",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sret",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "hret",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mret",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "dret",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sfence.vm",
codec: RV_CODEC_R,
format: RV_FMT_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sfence.vma",
codec: RV_CODEC_R,
format: RV_FMT_RS1_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "wfi",
codec: RV_CODEC_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrw",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_RS1,
pseudo: &RVCP_CSRRW,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrs",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_RS1,
pseudo: &RVCP_CSRRS,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrc",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrwi",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_ZIMM,
pseudo: &RVCP_CSRRWI,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrsi",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_ZIMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "csrrci",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_CSR_ZIMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "flw",
codec: RV_CODEC_I,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsw",
codec: RV_CODEC_S,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmadd.s",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmsub.s",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmsub.s",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmadd.s",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fadd.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsub.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmul.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fdiv.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnj.s",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJ_S,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjn.s",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJN_S,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjx.s",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJX_S,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmin.s",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmax.s",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsqrt.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fle.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "flt.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "feq.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.w.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.wu.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.w",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.wu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.x.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fclass.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.s.x",
codec: RV_CODEC_R,
format: RV_FMT_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.l.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.lu.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.l",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.lu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fld",
codec: RV_CODEC_I,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsd",
codec: RV_CODEC_S,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmadd.d",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmsub.d",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmsub.d",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmadd.d",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fadd.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsub.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmul.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fdiv.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnj.d",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJ_D,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjn.d",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJN_D,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjx.d",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJX_D,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmin.d",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmax.d",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsqrt.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fle.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "flt.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "feq.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.w.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.wu.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.w",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.wu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fclass.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.l.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.lu.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.x.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.l",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.lu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.d.x",
codec: RV_CODEC_R,
format: RV_FMT_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "flq",
codec: RV_CODEC_I,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsq",
codec: RV_CODEC_S,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmadd.q",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmsub.q",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmsub.q",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fnmadd.q",
codec: RV_CODEC_R4_M,
format: RV_FMT_RM_FRD_FRS1_FRS2_FRS3,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fadd.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsub.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmul.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fdiv.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnj.q",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJ_Q,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjn.q",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJN_Q,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsgnjx.q",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &RVCP_FSGNJX_Q,
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmin.q",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmax.q",
codec: RV_CODEC_R,
format: RV_FMT_FRD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.s.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.s",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.d.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.d",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsqrt.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fle.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "flt.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "feq.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1_FRS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.w.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.wu.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.w",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.wu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fclass.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.l.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.lu.q",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.l",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fcvt.q.lu",
codec: RV_CODEC_R_M,
format: RV_FMT_RM_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.x.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_FRS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.q.x",
codec: RV_CODEC_R,
format: RV_FMT_FRD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.addi4spn",
codec: RV_CODEC_CIW_4SPN,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.fld",
codec: RV_CODEC_CL_LD,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fld),
decomp_rv64: Some(RvOp::Fld),
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.lw",
codec: RV_CODEC_CL_LW,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Lw),
decomp_rv64: Some(RvOp::Lw),
decomp_rv128: Some(RvOp::Lw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.flw",
codec: RV_CODEC_CL_LW,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Flw),
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.fsd",
codec: RV_CODEC_CS_SD,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fsd),
decomp_rv64: Some(RvOp::Fsd),
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.sw",
codec: RV_CODEC_CS_SW,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Sw),
decomp_rv64: Some(RvOp::Sw),
decomp_rv128: Some(RvOp::Sw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.fsw",
codec: RV_CODEC_CS_SW,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fsw),
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.nop",
codec: RV_CODEC_CI_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.addi",
codec: RV_CODEC_CI,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::NzHint,
},
RvOpcodeData {
name: "c.jal",
codec: RV_CODEC_CJ_JAL,
format: RD_FMT_RD_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Jal),
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.li",
codec: RV_CODEC_CI_LI,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.addi16sp",
codec: RV_CODEC_CI_16SP,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.lui",
codec: RV_CODEC_CI_LUI,
format: RV_FMT_RD_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Lui),
decomp_rv64: Some(RvOp::Lui),
decomp_rv128: Some(RvOp::Lui),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.srli",
codec: RV_CODEC_CB_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Srli),
decomp_rv64: Some(RvOp::Srli),
decomp_rv128: Some(RvOp::Srli),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.srai",
codec: RV_CODEC_CB_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Srai),
decomp_rv64: Some(RvOp::Srai),
decomp_rv128: Some(RvOp::Srai),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.andi",
codec: RV_CODEC_CB_IMM,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Andi),
decomp_rv64: Some(RvOp::Andi),
decomp_rv128: Some(RvOp::Andi),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.sub",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Sub),
decomp_rv64: Some(RvOp::Sub),
decomp_rv128: Some(RvOp::Sub),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.xor",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Xor),
decomp_rv64: Some(RvOp::Xor),
decomp_rv128: Some(RvOp::Xor),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.or",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Or),
decomp_rv64: Some(RvOp::Or),
decomp_rv128: Some(RvOp::Or),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.and",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::And),
decomp_rv64: Some(RvOp::And),
decomp_rv128: Some(RvOp::And),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.subw",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Subw),
decomp_rv64: Some(RvOp::Subw),
decomp_rv128: Some(RvOp::Subw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.addw",
codec: RV_CODEC_CS,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Addw),
decomp_rv64: Some(RvOp::Addw),
decomp_rv128: Some(RvOp::Addw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.j",
codec: RV_CODEC_CJ,
format: RD_FMT_RD_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Jal),
decomp_rv64: Some(RvOp::Jal),
decomp_rv128: Some(RvOp::Jal),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.beqz",
codec: RV_CODEC_CB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Beq),
decomp_rv64: Some(RvOp::Beq),
decomp_rv128: Some(RvOp::Beq),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.bnez",
codec: RV_CODEC_CB,
format: RV_FMT_RS1_RS2_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Bne),
decomp_rv64: Some(RvOp::Bne),
decomp_rv128: Some(RvOp::Bne),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.slli",
codec: RV_CODEC_CI_SH6,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: Some(RvOp::Slli),
decomp_rv64: Some(RvOp::Slli),
decomp_rv128: Some(RvOp::Slli),
decomp_data: RvCdImmediate::Nz,
},
RvOpcodeData {
name: "c.fldsp",
codec: RV_CODEC_CI_LDSP,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fld),
decomp_rv64: Some(RvOp::Fld),
decomp_rv128: Some(RvOp::Fld),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.lwsp",
codec: RV_CODEC_CI_LWSP,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Lw),
decomp_rv64: Some(RvOp::Lw),
decomp_rv128: Some(RvOp::Lw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.flwsp",
codec: RV_CODEC_CI_LWSP,
format: RV_FMT_FRD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Flw),
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.jr",
codec: RV_CODEC_CR_JR,
format: RV_FMT_RD_RS1_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Jalr),
decomp_rv64: Some(RvOp::Jalr),
decomp_rv128: Some(RvOp::Jalr),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.mv",
codec: RV_CODEC_CR_MV,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Addi),
decomp_rv64: Some(RvOp::Addi),
decomp_rv128: Some(RvOp::Addi),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.ebreak",
codec: RV_CODEC_CI_NONE,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: Some(RvOp::Ebreak),
decomp_rv64: Some(RvOp::Ebreak),
decomp_rv128: Some(RvOp::Ebreak),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.jalr",
codec: RV_CODEC_CR_JALR,
format: RV_FMT_RD_RS1_OFFSET,
pseudo: &[],
decomp_rv32: Some(RvOp::Jalr),
decomp_rv64: Some(RvOp::Jalr),
decomp_rv128: Some(RvOp::Jalr),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.add",
codec: RV_CODEC_CR,
format: RV_FMT_RD_RS1_RS2,
pseudo: &[],
decomp_rv32: Some(RvOp::Add),
decomp_rv64: Some(RvOp::Add),
decomp_rv128: Some(RvOp::Add),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.fsdsp",
codec: RV_CODEC_CSS_SDSP,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fsd),
decomp_rv64: Some(RvOp::Fsd),
decomp_rv128: Some(RvOp::Fsd),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.swsp",
codec: RV_CODEC_CSS_SWSP,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Sw),
decomp_rv64: Some(RvOp::Sw),
decomp_rv128: Some(RvOp::Sw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.fswsp",
codec: RV_CODEC_CSS_SWSP,
format: RV_FMT_FRS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: Some(RvOp::Fsw),
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.ld",
codec: RV_CODEC_CL_LD,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: Some(RvOp::Ld),
decomp_rv128: Some(RvOp::Ld),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.sd",
codec: RV_CODEC_CS_SD,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: Some(RvOp::Sd),
decomp_rv128: Some(RvOp::Sd),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.addiw",
codec: RV_CODEC_CI,
format: RV_FMT_RD_RS1_IMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: Some(RvOp::Addiw),
decomp_rv128: Some(RvOp::Addiw),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.ldsp",
codec: RV_CODEC_CI_LDSP,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: Some(RvOp::Ld),
decomp_rv128: Some(RvOp::Ld),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.sdsp",
codec: RV_CODEC_CSS_SDSP,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: Some(RvOp::Sd),
decomp_rv128: Some(RvOp::Sd),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.lq",
codec: RV_CODEC_CL_LQ,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: Some(RvOp::Lq),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.sq",
codec: RV_CODEC_CS_SQ,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: Some(RvOp::Sq),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.lqsp",
codec: RV_CODEC_CI_LQSP,
format: RV_FMT_RD_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: Some(RvOp::Lq),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "c.sqsp",
codec: RV_CODEC_RSS_SQSP,
format: RV_FMT_RS2_OFFSET_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: Some(RvOp::Sq),
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "nop",
codec: RV_CODEC_I,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "mv",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "not",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "neg",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "negw",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sext.w",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "seqz",
codec: RV_CODEC_I,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "snez",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sltz",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "sgtz",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS2,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fabs.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fneg.s",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fabs.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fneg.d",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fmv.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fabs.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fneg.q",
codec: RV_CODEC_R,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "beqz",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bnez",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "blez",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bgez",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bltz",
codec: RV_CODEC_SB,
format: RV_FMT_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bgtz",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ble",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bleu",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bgt",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "bgtu",
codec: RV_CODEC_SB,
format: RV_FMT_RS2_RS1_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "j",
codec: RV_CODEC_UJ,
format: RV_FMT_OFFSET,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "ret",
codec: RV_CODEC_I,
format: RV_FMT_NONE,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "jr",
codec: RV_CODEC_I,
format: RV_FMT_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdcycle",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdtime",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdinstret",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdcycleh",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdtimeh",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "rdinstreth",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "frcsr",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "frrm",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "frflags",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fscsr",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsrm",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsflags",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_RS1,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsrmi",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_ZIMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
RvOpcodeData {
name: "fsflagsi",
codec: RV_CODEC_I_CSR,
format: RV_FMT_RD_ZIMM,
pseudo: &[],
decomp_rv32: None,
decomp_rv64: None,
decomp_rv128: None,
decomp_data: RvCdImmediate::None,
},
];
fn csr_name(csrno: i32) -> Option<&'static str> {
match csrno {
0 => Some("ustatus"),
1 => Some("fflags"),
2 => Some("frm"),
3 => Some("fcsr"),
4 => Some("uie"),
5 => Some("utvec"),
7 => Some("utvt"),
8 => Some("vstart"),
9 => Some("vxsat"),
10 => Some("vxrm"),
15 => Some("vcsr"),
64 => Some("uscratch"),
65 => Some("uepc"),
66 => Some("ucause"),
67 => Some("utval"),
68 => Some("uip"),
69 => Some("unxti"),
70 => Some("uintstatus"),
72 => Some("uscratchcsw"),
73 => Some("uscratchcswl"),
256 => Some("sstatus"),
258 => Some("sedeleg"),
259 => Some("sideleg"),
260 => Some("sie"),
261 => Some("stvec"),
262 => Some("scounteren"),
263 => Some("stvt"),
320 => Some("sscratch"),
321 => Some("sepc"),
322 => Some("scause"),
323 => Some("stval"),
324 => Some("sip"),
325 => Some("snxti"),
326 => Some("sintstatus"),
328 => Some("sscratchcsw"),
329 => Some("sscratchcswl"),
384 => Some("satp"),
512 => Some("vsstatus"),
516 => Some("vsie"),
517 => Some("vstvec"),
576 => Some("vsscratch"),
577 => Some("vsepc"),
578 => Some("vscause"),
579 => Some("vstval"),
580 => Some("vsip"),
640 => Some("vsatp"),
768 => Some("mstatus"),
769 => Some("misa"),
770 => Some("medeleg"),
771 => Some("mideleg"),
772 => Some("mie"),
773 => Some("mtvec"),
774 => Some("mcounteren"),
775 => Some("mtvt"),
784 => Some("mstatush"),
800 => Some("mcountinhibit"),
803 => Some("mhpmevent3"),
804 => Some("mhpmevent4"),
805 => Some("mhpmevent5"),
806 => Some("mhpmevent6"),
807 => Some("mhpmevent7"),
808 => Some("mhpmevent8"),
809 => Some("mhpmevent9"),
810 => Some("mhpmevent10"),
811 => Some("mhpmevent11"),
812 => Some("mhpmevent12"),
813 => Some("mhpmevent13"),
814 => Some("mhpmevent14"),
815 => Some("mhpmevent15"),
816 => Some("mhpmevent16"),
817 => Some("mhpmevent17"),
818 => Some("mhpmevent18"),
819 => Some("mhpmevent19"),
820 => Some("mhpmevent20"),
821 => Some("mhpmevent21"),
822 => Some("mhpmevent22"),
823 => Some("mhpmevent23"),
824 => Some("mhpmevent24"),
825 => Some("mhpmevent25"),
826 => Some("mhpmevent26"),
827 => Some("mhpmevent27"),
828 => Some("mhpmevent28"),
829 => Some("mhpmevent29"),
830 => Some("mhpmevent30"),
831 => Some("mhpmevent31"),
832 => Some("mscratch"),
833 => Some("mepc"),
834 => Some("mcause"),
835 => Some("mtval"),
836 => Some("mip"),
837 => Some("mnxti"),
838 => Some("mintstatus"),
840 => Some("mscratchcsw"),
841 => Some("mscratchcswl"),
842 => Some("mtinst"),
843 => Some("mtval2"),
928 => Some("pmpcfg0"),
929 => Some("pmpcfg1"),
930 => Some("pmpcfg2"),
931 => Some("pmpcfg3"),
944 => Some("pmpaddr0"),
945 => Some("pmpaddr1"),
946 => Some("pmpaddr2"),
947 => Some("pmpaddr3"),
948 => Some("pmpaddr4"),
949 => Some("pmpaddr5"),
950 => Some("pmpaddr6"),
951 => Some("pmpaddr7"),
952 => Some("pmpaddr8"),
953 => Some("pmpaddr9"),
954 => Some("pmpaddr10"),
955 => Some("pmpaddr11"),
956 => Some("pmpaddr12"),
957 => Some("pmpaddr13"),
958 => Some("pmpaddr14"),
959 => Some("pmpaddr15"),
1536 => Some("hstatus"),
1538 => Some("hedeleg"),
1539 => Some("hideleg"),
1540 => Some("hie"),
1541 => Some("htimedelta"),
1542 => Some("hcounteren"),
1543 => Some("hgeie"),
1557 => Some("htimedeltah"),
1603 => Some("htval"),
1604 => Some("hip"),
1605 => Some("hvip"),
1610 => Some("htinst"),
1664 => Some("hgatp"),
1952 => Some("tselect"),
1953 => Some("tdata1"),
1954 => Some("tdata2"),
1955 => Some("tdata3"),
1956 => Some("tinfo"),
1957 => Some("tcontrol"),
1960 => Some("mcontext"),
1961 => Some("mnoise"),
1962 => Some("scontext"),
1968 => Some("dcsr"),
1969 => Some("dpc"),
1970 => Some("dscratch0"),
1971 => Some("dscratch1"),
2816 => Some("mcycle"),
2818 => Some("minstret"),
2819 => Some("mhpmcounter3"),
2820 => Some("mhpmcounter4"),
2821 => Some("mhpmcounter5"),
2822 => Some("mhpmcounter6"),
2823 => Some("mhpmcounter7"),
2824 => Some("mhpmcounter8"),
2825 => Some("mhpmcounter9"),
2826 => Some("mhpmcounter10"),
2827 => Some("mhpmcounter11"),
2828 => Some("mhpmcounter12"),
2829 => Some("mhpmcounter13"),
2830 => Some("mhpmcounter14"),
2831 => Some("mhpmcounter15"),
2832 => Some("mhpmcounter16"),
2833 => Some("mhpmcounter17"),
2834 => Some("mhpmcounter18"),
2835 => Some("mhpmcounter19"),
2836 => Some("mhpmcounter20"),
2837 => Some("mhpmcounter21"),
2838 => Some("mhpmcounter22"),
2839 => Some("mhpmcounter23"),
2840 => Some("mhpmcounter24"),
2841 => Some("mhpmcounter25"),
2842 => Some("mhpmcounter26"),
2843 => Some("mhpmcounter27"),
2844 => Some("mhpmcounter28"),
2845 => Some("mhpmcounter29"),
2846 => Some("mhpmcounter30"),
2847 => Some("mhpmcounter31"),
2944 => Some("mcycleh"),
2946 => Some("minstreth"),
2947 => Some("mhpmcounter3h"),
2948 => Some("mhpmcounter4h"),
2949 => Some("mhpmcounter5h"),
2950 => Some("mhpmcounter6h"),
2951 => Some("mhpmcounter7h"),
2952 => Some("mhpmcounter8h"),
2953 => Some("mhpmcounter9h"),
2954 => Some("mhpmcounter10h"),
2955 => Some("mhpmcounter11h"),
2956 => Some("mhpmcounter12h"),
2957 => Some("mhpmcounter13h"),
2958 => Some("mhpmcounter14h"),
2959 => Some("mhpmcounter15h"),
2960 => Some("mhpmcounter16h"),
2961 => Some("mhpmcounter17h"),
2962 => Some("mhpmcounter18h"),
2963 => Some("mhpmcounter19h"),
2964 => Some("mhpmcounter20h"),
2965 => Some("mhpmcounter21h"),
2966 => Some("mhpmcounter22h"),
2967 => Some("mhpmcounter23h"),
2968 => Some("mhpmcounter24h"),
2969 => Some("mhpmcounter25h"),
2970 => Some("mhpmcounter26h"),
2971 => Some("mhpmcounter27h"),
2972 => Some("mhpmcounter28h"),
2973 => Some("mhpmcounter29h"),
2974 => Some("mhpmcounter30h"),
2975 => Some("mhpmcounter31h"),
3072 => Some("cycle"),
3073 => Some("time"),
3074 => Some("instret"),
3075 => Some("hpmcounter3"),
3076 => Some("hpmcounter4"),
3077 => Some("hpmcounter5"),
3078 => Some("hpmcounter6"),
3079 => Some("hpmcounter7"),
3080 => Some("hpmcounter8"),
3081 => Some("hpmcounter9"),
3082 => Some("hpmcounter10"),
3083 => Some("hpmcounter11"),
3084 => Some("hpmcounter12"),
3085 => Some("hpmcounter13"),
3086 => Some("hpmcounter14"),
3087 => Some("hpmcounter15"),
3088 => Some("hpmcounter16"),
3089 => Some("hpmcounter17"),
3090 => Some("hpmcounter18"),
3091 => Some("hpmcounter19"),
3092 => Some("hpmcounter20"),
3093 => Some("hpmcounter21"),
3094 => Some("hpmcounter22"),
3095 => Some("hpmcounter23"),
3096 => Some("hpmcounter24"),
3097 => Some("hpmcounter25"),
3098 => Some("hpmcounter26"),
3099 => Some("hpmcounter27"),
3100 => Some("hpmcounter28"),
3101 => Some("hpmcounter29"),
3102 => Some("hpmcounter30"),
3103 => Some("hpmcounter31"),
3104 => Some("vl"),
3105 => Some("vtype"),
3106 => Some("vlenb"),
3200 => Some("cycleh"),
3201 => Some("timeh"),
3202 => Some("instreth"),
3203 => Some("hpmcounter3h"),
3204 => Some("hpmcounter4h"),
3205 => Some("hpmcounter5h"),
3206 => Some("hpmcounter6h"),
3207 => Some("hpmcounter7h"),
3208 => Some("hpmcounter8h"),
3209 => Some("hpmcounter9h"),
3210 => Some("hpmcounter10h"),
3211 => Some("hpmcounter11h"),
3212 => Some("hpmcounter12h"),
3213 => Some("hpmcounter13h"),
3214 => Some("hpmcounter14h"),
3215 => Some("hpmcounter15h"),
3216 => Some("hpmcounter16h"),
3217 => Some("hpmcounter17h"),
3218 => Some("hpmcounter18h"),
3219 => Some("hpmcounter19h"),
3220 => Some("hpmcounter20h"),
3221 => Some("hpmcounter21h"),
3222 => Some("hpmcounter22h"),
3223 => Some("hpmcounter23h"),
3224 => Some("hpmcounter24h"),
3225 => Some("hpmcounter25h"),
3226 => Some("hpmcounter26h"),
3227 => Some("hpmcounter27h"),
3228 => Some("hpmcounter28h"),
3229 => Some("hpmcounter29h"),
3230 => Some("hpmcounter30h"),
3231 => Some("hpmcounter31h"),
3602 => Some("hgeip"),
3857 => Some("mvendorid"),
3858 => Some("marchid"),
3859 => Some("mimpid"),
3860 => Some("mhartid"),
3861 => Some("mentropy"),
_ => None,
}
}
fn decode_inst_opcode(dec: &mut RvDecode, isa: RvIsa) {
let inst = dec.inst;
let mut op = RvOp::Illegal;
match inst >> 0 & 0o3 {
0 => match inst >> 13 & 0o7 {
0 => {
op = RvOp::CAddi4spn;
}
1 => {
op = if isa == RvIsa::Rv128 {
RvOp::CLq
} else {
RvOp::CFld
};
}
2 => {
op = RvOp::CLw;
}
3 => {
op = if isa == RvIsa::Rv32 {
RvOp::CFlw
} else {
RvOp::CLd
};
}
5 => {
op = if isa == RvIsa::Rv128 {
RvOp::CSq
} else {
RvOp::CFsd
};
}
6 => {
op = RvOp::CSw;
}
7 => {
op = if isa == RvIsa::Rv32 {
RvOp::CFsw
} else {
RvOp::CSd
};
}
_ => {}
},
1 => match inst >> 13 & 0o7 {
0 => match inst >> 2 & 0o3777 {
0 => {
op = RvOp::CNop;
}
_ => {
op = RvOp::CAddi;
}
},
1 => {
op = if isa == RvIsa::Rv32 {
RvOp::CJal
} else {
RvOp::CAddiw
};
}
2 => {
op = RvOp::CLi;
}
3 => match inst >> 7 & 0o37 {
2 => {
op = RvOp::CAddi16sp;
}
_ => {
op = RvOp::CLui;
}
},
4 => match inst >> 10 & 0o3 {
0 => {
op = RvOp::CSrli;
}
1 => {
op = RvOp::CSrai;
}
2 => {
op = RvOp::CAndi;
}
3 => match inst >> 10 & 0o4 as u64 | inst >> 5 & 0o3 as u64 {
0 => {
op = RvOp::CSub;
}
1 => {
op = RvOp::CXor;
}
2 => {
op = RvOp::COr;
}
3 => {
op = RvOp::CAnd;
}
4 => {
op = RvOp::CSubw;
}
5 => {
op = RvOp::CAddw;
}
_ => {}
},
_ => {}
},
5 => {
op = RvOp::CJ;
}
6 => {
op = RvOp::CBeqz;
}
7 => {
op = RvOp::CBnez;
}
_ => {}
},
2 => match inst >> 13 & 0o7 as u64 {
0 => {
op = RvOp::CSlli;
}
1 => {
op = if isa == RvIsa::Rv128 {
RvOp::CLqsp
} else {
RvOp::CFldsp
};
}
2 => {
op = RvOp::CLwsp;
}
3 => {
op = if isa == RvIsa::Rv32 {
RvOp::CFlwsp
} else {
RvOp::CLdsp
};
}
4 => match inst >> 12 & 0o1 as u64 {
0 => match inst >> 2 & 0o37 as u64 {
0 => {
op = RvOp::CJr;
}
_ => {
op = RvOp::CMv;
}
},
1 => match inst >> 2 & 0o37 as u64 {
0 => match inst >> 7 & 0o37 as u64 {
0 => {
op = RvOp::CEbreak;
}
_ => {
op = RvOp::CJalr;
}
},
_ => {
op = RvOp::CAdd;
}
},
_ => {}
},
5 => {
op = if isa == RvIsa::Rv128 {
RvOp::CSqsp
} else {
RvOp::CFsdsp
};
}
6 => {
op = RvOp::CSwsp;
}
7 => {
op = if isa == RvIsa::Rv32 {
RvOp::CFswsp
} else {
RvOp::CSdsp
};
}
_ => {}
},
3 => match inst >> 2 & 0o37 as u64 {
0 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Lb;
}
1 => {
op = RvOp::Lh;
}
2 => {
op = RvOp::Lw;
}
3 => {
op = RvOp::Ld;
}
4 => {
op = RvOp::Lbu;
}
5 => {
op = RvOp::Lhu;
}
6 => {
op = RvOp::Lwu;
}
7 => {
op = RvOp::Ldu;
}
_ => {}
},
1 => match inst >> 12 & 0o7 as u64 {
2 => {
op = RvOp::Flw;
}
3 => {
op = RvOp::Fld;
}
4 => {
op = RvOp::Flq;
}
_ => {}
},
3 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Fence;
}
1 => {
op = RvOp::FenceI;
}
2 => {
op = RvOp::Lq;
}
_ => {}
},
4 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Addi;
}
1 => match inst >> 27 & 0o37 as u64 {
0 => {
op = RvOp::Slli;
}
_ => {}
},
2 => {
op = RvOp::Slti;
}
3 => {
op = RvOp::Sltiu;
}
4 => {
op = RvOp::Xori;
}
5 => match inst >> 27 & 0o37 as u64 {
0 => {
op = RvOp::Srli;
}
8 => {
op = RvOp::Srai;
}
_ => {}
},
6 => {
op = RvOp::Ori;
}
7 => {
op = RvOp::Andi;
}
_ => {}
},
5 => {
op = RvOp::Auipc;
}
6 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Addiw;
}
1 => match inst >> 25 & 0o177 as u64 {
0 => {
op = RvOp::Slliw;
}
_ => {}
},
5 => match inst >> 25 & 0o177 as u64 {
0 => {
op = RvOp::Srliw;
}
32 => {
op = RvOp::Sraiw;
}
_ => {}
},
_ => {}
},
8 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Sb;
}
1 => {
op = RvOp::Sh;
}
2 => {
op = RvOp::Sw;
}
3 => {
op = RvOp::Sd;
}
4 => {
op = RvOp::Sq;
}
_ => {}
},
9 => match inst >> 12 & 0o7 as u64 {
2 => {
op = RvOp::Fsw;
}
3 => {
op = RvOp::Fsd;
}
4 => {
op = RvOp::Fsq;
}
_ => {}
},
11 => match inst >> 24 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
2 => {
op = RvOp::AmoaddW;
}
3 => {
op = RvOp::AmoaddD;
}
4 => {
op = RvOp::AmoaddQ;
}
10 => {
op = RvOp::AmoswapW;
}
11 => {
op = RvOp::AmoswapD;
}
12 => {
op = RvOp::AmoswapQ;
}
18 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::LrW;
}
_ => {}
},
19 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::LrD;
}
_ => {}
},
20 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::LrQ;
}
_ => {}
},
26 => {
op = RvOp::ScW;
}
27 => {
op = RvOp::ScD;
}
28 => {
op = RvOp::ScQ;
}
34 => {
op = RvOp::AmoxorW;
}
35 => {
op = RvOp::AmoxorD;
}
36 => {
op = RvOp::AmoxorQ;
}
66 => {
op = RvOp::AmoorW;
}
67 => {
op = RvOp::AmoorD;
}
68 => {
op = RvOp::AmoorQ;
}
98 => {
op = RvOp::AmoandW;
}
99 => {
op = RvOp::AmoandD;
}
100 => {
op = RvOp::AmoandQ;
}
130 => {
op = RvOp::AmominW;
}
131 => {
op = RvOp::AmominD;
}
132 => {
op = RvOp::AmominQ;
}
162 => {
op = RvOp::AmomaxW;
}
163 => {
op = RvOp::AmomaxD;
}
164 => {
op = RvOp::AmomaxQ;
}
194 => {
op = RvOp::AmominuW;
}
195 => {
op = RvOp::AmominuD;
}
196 => {
op = RvOp::AmominuQ;
}
226 => {
op = RvOp::AmomaxuW;
}
227 => {
op = RvOp::AmomaxuD;
}
228 => {
op = RvOp::AmomaxuQ;
}
_ => {}
},
12 => match inst >> 22 & 0o1770 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Add;
}
1 => {
op = RvOp::Sll;
}
2 => {
op = RvOp::Slt;
}
3 => {
op = RvOp::Sltu;
}
4 => {
op = RvOp::Xor;
}
5 => {
op = RvOp::Srl;
}
6 => {
op = RvOp::Or;
}
7 => {
op = RvOp::And;
}
8 => {
op = RvOp::Mul;
}
9 => {
op = RvOp::Mulh;
}
10 => {
op = RvOp::Mulhsu;
}
11 => {
op = RvOp::Mulhu;
}
12 => {
op = RvOp::Div;
}
13 => {
op = RvOp::Divu;
}
14 => {
op = RvOp::Rem;
}
15 => {
op = RvOp::Remu;
}
256 => {
op = RvOp::Sub;
}
261 => {
op = RvOp::Sra;
}
_ => {}
},
13 => {
op = RvOp::Lui;
}
14 => match inst >> 22 & 0o1770 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Addw;
}
1 => {
op = RvOp::Sllw;
}
5 => {
op = RvOp::Srlw;
}
8 => {
op = RvOp::Mulw;
}
12 => {
op = RvOp::Divw;
}
13 => {
op = RvOp::Divuw;
}
14 => {
op = RvOp::Remw;
}
15 => {
op = RvOp::Remuw;
}
256 => {
op = RvOp::Subw;
}
261 => {
op = RvOp::Sraw;
}
_ => {}
},
16 => match inst >> 25 & 0o3 as u64 {
0 => {
op = RvOp::FmaddS;
}
1 => {
op = RvOp::FmaddD;
}
3 => {
op = RvOp::FmaddQ;
}
_ => {}
},
17 => match inst >> 25 & 0o3 as u64 {
0 => {
op = RvOp::FmsubS;
}
1 => {
op = RvOp::FmsubD;
}
3 => {
op = RvOp::FmsubQ;
}
_ => {}
},
18 => match inst >> 25 & 0o3 as u64 {
0 => {
op = RvOp::FnmsubS;
}
1 => {
op = RvOp::FnmsubD;
}
3 => {
op = RvOp::FnmsubQ;
}
_ => {}
},
19 => match inst >> 25 & 0o3 as u64 {
0 => {
op = RvOp::FnmaddS;
}
1 => {
op = RvOp::FnmaddD;
}
3 => {
op = RvOp::FnmaddQ;
}
_ => {}
},
20 => match inst >> 25 & 0o177 as u64 {
0 => {
op = RvOp::FaddS;
}
1 => {
op = RvOp::FaddD;
}
3 => {
op = RvOp::FaddQ;
}
4 => {
op = RvOp::FsubS;
}
5 => {
op = RvOp::FsubD;
}
7 => {
op = RvOp::FsubQ;
}
8 => {
op = RvOp::FmulS;
}
9 => {
op = RvOp::FmulD;
}
11 => {
op = RvOp::FmulQ;
}
12 => {
op = RvOp::FdivS;
}
13 => {
op = RvOp::FdivD;
}
15 => {
op = RvOp::FdivQ;
}
16 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FsgnjS;
}
1 => {
op = RvOp::FsgnjnS;
}
2 => {
op = RvOp::FsgnjxS;
}
_ => {}
},
17 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FsgnjD;
}
1 => {
op = RvOp::FsgnjnD;
}
2 => {
op = RvOp::FsgnjxD;
}
_ => {}
},
19 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FsgnjQ;
}
1 => {
op = RvOp::FsgnjnQ;
}
2 => {
op = RvOp::FsgnjxQ;
}
_ => {}
},
20 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FminS;
}
1 => {
op = RvOp::FmaxS;
}
_ => {}
},
21 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FminD;
}
1 => {
op = RvOp::FmaxD;
}
_ => {}
},
23 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FminQ;
}
1 => {
op = RvOp::FmaxQ;
}
_ => {}
},
32 => match inst >> 20 & 0o37 as u64 {
1 => {
op = RvOp::FcvtSD;
}
3 => {
op = RvOp::FcvtSQ;
}
_ => {}
},
33 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtDS;
}
3 => {
op = RvOp::FcvtDQ;
}
_ => {}
},
35 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtQS;
}
1 => {
op = RvOp::FcvtQD;
}
_ => {}
},
44 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FsqrtS;
}
_ => {}
},
45 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FsqrtD;
}
_ => {}
},
47 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FsqrtQ;
}
_ => {}
},
80 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FleS;
}
1 => {
op = RvOp::FltS;
}
2 => {
op = RvOp::FeqS;
}
_ => {}
},
81 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FleD;
}
1 => {
op = RvOp::FltD;
}
2 => {
op = RvOp::FeqD;
}
_ => {}
},
83 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FleQ;
}
1 => {
op = RvOp::FltQ;
}
2 => {
op = RvOp::FeqQ;
}
_ => {}
},
96 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtWS;
}
1 => {
op = RvOp::FcvtWuS;
}
2 => {
op = RvOp::FcvtLS;
}
3 => {
op = RvOp::FcvtLuS;
}
_ => {}
},
97 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtWD;
}
1 => {
op = RvOp::FcvtWuD;
}
2 => {
op = RvOp::FcvtLD;
}
3 => {
op = RvOp::FcvtLuD;
}
_ => {}
},
99 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtWQ;
}
1 => {
op = RvOp::FcvtWuQ;
}
2 => {
op = RvOp::FcvtLQ;
}
3 => {
op = RvOp::FcvtLuQ;
}
_ => {}
},
104 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtSW;
}
1 => {
op = RvOp::FcvtSWu;
}
2 => {
op = RvOp::FcvtSL;
}
3 => {
op = RvOp::FcvtSLu;
}
_ => {}
},
105 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtDW;
}
1 => {
op = RvOp::FcvtDWu;
}
2 => {
op = RvOp::FcvtDL;
}
3 => {
op = RvOp::FcvtDLu;
}
_ => {}
},
107 => match inst >> 20 & 0o37 as u64 {
0 => {
op = RvOp::FcvtQW;
}
1 => {
op = RvOp::FcvtQWu;
}
2 => {
op = RvOp::FcvtQL;
}
3 => {
op = RvOp::FcvtQLu;
}
_ => {}
},
112 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvXS;
}
1 => {
op = RvOp::FclassS;
}
_ => {}
},
113 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvXD;
}
1 => {
op = RvOp::FclassD;
}
_ => {}
},
115 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvXQ;
}
1 => {
op = RvOp::FclassQ;
}
_ => {}
},
120 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvSX;
}
_ => {}
},
121 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvDX;
}
_ => {}
},
123 => match inst >> 17 & 0o370 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::FmvQX;
}
_ => {}
},
_ => {}
},
22 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Addid;
}
1 => match inst >> 26 & 0o77 as u64 {
0 => {
op = RvOp::Sllid;
}
_ => {}
},
5 => match inst >> 26 & 0o77 as u64 {
0 => {
op = RvOp::Srlid;
}
16 => {
op = RvOp::Sraid;
}
_ => {}
},
_ => {}
},
24 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Beq;
}
1 => {
op = RvOp::Bne;
}
4 => {
op = RvOp::Blt;
}
5 => {
op = RvOp::Bge;
}
6 => {
op = RvOp::Bltu;
}
7 => {
op = RvOp::Bgeu;
}
_ => {}
},
25 => match inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Jalr;
}
_ => {}
},
27 => {
op = RvOp::Jal;
}
28 => match inst >> 12 & 0o7 as u64 {
0 => match inst >> 20 & 0o7740 as u64 | inst >> 7 & 0o37 as u64 {
0 => match inst >> 15 & 0o1777 as u64 {
0 => {
op = RvOp::Ecall;
}
32 => {
op = RvOp::Ebreak;
}
64 => {
op = RvOp::Uret;
}
_ => {}
},
256 => match inst >> 20 & 0o37 as u64 {
2 => match inst >> 15 & 0o37 as u64 {
0 => {
op = RvOp::Sret;
}
_ => {}
},
4 => {
op = RvOp::SfenceVm;
}
5 => match inst >> 15 & 0o37 as u64 {
0 => {
op = RvOp::Wfi;
}
_ => {}
},
_ => {}
},
288 => {
op = RvOp::SfenceVma;
}
512 => match inst >> 15 & 0o1777 as u64 {
64 => {
op = RvOp::Hret;
}
_ => {}
},
768 => match inst >> 15 & 0o1777 as u64 {
64 => {
op = RvOp::Mret;
}
_ => {}
},
1952 => match inst >> 15 & 0o1777 as u64 {
576 => {
op = RvOp::Dret;
}
_ => {}
},
_ => {}
},
1 => {
op = RvOp::Csrrw;
}
2 => {
op = RvOp::Csrrs;
}
3 => {
op = RvOp::Csrrc;
}
5 => {
op = RvOp::Csrrwi;
}
6 => {
op = RvOp::Csrrsi;
}
7 => {
op = RvOp::Csrrci;
}
_ => {}
},
30 => match inst >> 22 & 0o1770 as u64 | inst >> 12 & 0o7 as u64 {
0 => {
op = RvOp::Addd;
}
1 => {
op = RvOp::Slld;
}
5 => {
op = RvOp::Srld;
}
8 => {
op = RvOp::Muld;
}
12 => {
op = RvOp::Divd;
}
13 => {
op = RvOp::Divud;
}
14 => {
op = RvOp::Remd;
}
15 => {
op = RvOp::Remud;
}
256 => {
op = RvOp::Subd;
}
261 => {
op = RvOp::Srad;
}
_ => {}
},
_ => {}
},
_ => {}
}
dec.op = op;
}
fn operand_rd(inst: RvInst) -> u8 {
(inst << 52 >> 59) as u8
}
fn operand_rs1(inst: RvInst) -> u8 {
(inst << 44 >> 59) as u8
}
fn operand_rs2(inst: RvInst) -> u8 {
(inst << 39 >> 59) as u8
}
fn operand_rs3(inst: RvInst) -> u8 {
(inst << 32 >> 59) as u8
}
fn operand_aq(inst: RvInst) -> u8 {
(inst << 37 >> 63) as u8
}
fn operand_rl(inst: RvInst) -> u8 {
(inst << 38 >> 63) as u8
}
fn operand_pred(inst: RvInst) -> u8 {
(inst << 36 >> 60) as u8
}
fn operand_succ(inst: RvInst) -> u8 {
(inst << 40 >> 60) as u8
}
fn operand_rm(inst: RvInst) -> u8 {
(inst << 49 >> 61) as u8
}
fn operand_shamt5(inst: RvInst) -> i32 {
(inst << 39 >> 59) as i32
}
fn operand_shamt6(inst: RvInst) -> i32 {
(inst << 38 >> 58) as i32
}
fn operand_shamt7(inst: RvInst) -> i32 {
(inst << 37 >> 57) as i32
}
fn operand_crdq(inst: RvInst) -> u8 {
(inst << 59 >> 61) as u8
}
fn operand_crs1q(inst: RvInst) -> u8 {
(inst << 54 >> 61) as u8
}
fn operand_crs1rdq(inst: RvInst) -> u8 {
(inst << 54 >> 61) as u8
}
fn operand_crs2q(inst: RvInst) -> u8 {
(inst << 59 >> 61) as u8
}
fn operand_crd(inst: RvInst) -> u8 {
(inst << 52 >> 59) as u8
}
fn operand_crs1(inst: RvInst) -> u8 {
(inst << 52 >> 59) as u8
}
fn operand_crs1rd(inst: RvInst) -> u8 {
(inst << 52 >> 59) as u8
}
fn operand_crs2(inst: RvInst) -> u8 {
(inst << 57 >> 59) as u8
}
fn operand_cimmsh5(inst: RvInst) -> i32 {
(inst << 57 >> 59) as i32
}
fn operand_csr12(inst: RvInst) -> i32 {
(inst << 32 >> 52) as i32
}
fn operand_imm12(inst: RvInst) -> i32 {
((inst as i64) << 32 >> 52) as i32
}
fn operand_imm20(inst: RvInst) -> i32 {
(((inst as i64) << 32 >> 44) << 12) as i32
}
fn operand_jimm20(inst: RvInst) -> i32 {
((((inst as i64) << 32 >> 63) << 20) as u64
| (inst << 33 >> 54) << 1
| (inst << 43 >> 63) << 11
| (inst << 44 >> 56) << 12) as i32
}
fn operand_simm12(inst: RvInst) -> i32 {
((((inst as i64) << 32 >> 57) << 5) as u64 | inst << 52 >> 59) as i32
}
fn operand_sbimm12(inst: RvInst) -> i32 {
((((inst as i64) << 32 >> 63) << 12) as u64
| (inst << 33 >> 58) << 5
| (inst << 52 >> 60) << 1
| (inst << 56 >> 63) << 11) as i32
}
fn operand_cimmsh6(inst: RvInst) -> i32 {
((inst << 51 >> 63) << 5 | inst << 57 >> 59) as i32
}
fn operand_cimmi(inst: RvInst) -> i32 {
((((inst as i64) << 51 >> 63) << 5) as u64 | inst << 57 >> 59) as i32
}
fn operand_cimmui(inst: RvInst) -> i32 {
((((inst as i64) << 51 >> 63) << 17) as u64 | (inst << 57 >> 59) << 12) as i32
}
fn operand_cimmlwsp(inst: RvInst) -> i32 {
((inst << 51 >> 63) << 5 | (inst << 57 >> 61) << 2 | (inst << 60 >> 62) << 6) as i32
}
fn operand_cimmldsp(inst: RvInst) -> i32 {
((inst << 51 >> 63) << 5 | (inst << 57 >> 62) << 3 | (inst << 59 >> 61) << 6) as i32
}
fn operand_cimmlqsp(inst: RvInst) -> i32 {
((inst << 51 >> 63) << 5 | (inst << 57 >> 63) << 4 | (inst << 58 >> 60) << 6) as i32
}
fn operand_cimm16sp(inst: RvInst) -> i32 {
((((inst as i64) << 51 >> 63) << 9) as u64
| (inst << 57 >> 63) << 4
| (inst << 58 >> 63) << 6
| (inst << 59 >> 62) << 7
| (inst << 61 >> 63) << 5) as i32
}
fn operand_cimmj(inst: RvInst) -> i32 {
((((inst as i64) << 51 >> 63) << 11) as u64
| (inst << 52 >> 63) << 4
| (inst << 53 >> 62) << 8
| (inst << 55 >> 63) << 10
| (inst << 56 >> 63) << 6
| (inst << 57 >> 63) << 7
| (inst << 58 >> 61) << 1
| (inst << 61 >> 63) << 5) as i32
}
fn operand_cimmb(inst: RvInst) -> i32 {
((((inst as i64) << 51 >> 63) << 8) as u64
| (inst << 52 >> 62) << 3
| (inst << 57 >> 62) << 6
| (inst << 59 >> 62) << 1
| (inst << 61 >> 63) << 5) as i32
}
fn operand_cimmswsp(inst: RvInst) -> i32 {
((inst << 51 >> 60) << 2 | (inst << 55 >> 62) << 6) as i32
}
fn operand_cimmsdsp(inst: RvInst) -> i32 {
((inst << 51 >> 61) << 3 | (inst << 54 >> 61) << 6) as i32
}
fn operand_cimmsqsp(inst: RvInst) -> i32 {
((inst << 51 >> 62) << 4 | (inst << 53 >> 60) << 6) as i32
}
fn operand_cimm4spn(inst: RvInst) -> i32 {
((inst << 51 >> 62) << 4
| (inst << 53 >> 60) << 6
| (inst << 57 >> 63) << 2
| (inst << 58 >> 63) << 3) as i32
}
fn operand_cimmw(inst: RvInst) -> i32 {
((inst << 51 >> 61) << 3 | (inst << 57 >> 63) << 2 | (inst << 58 >> 63) << 6) as i32
}
fn operand_cimmd(inst: RvInst) -> i32 {
((inst << 51 >> 61) << 3 | (inst << 57 >> 62) << 6) as i32
}
fn operand_cimmq(inst: RvInst) -> i32 {
((inst << 51 >> 62) << 4 | (inst << 53 >> 63) << 8 | (inst << 57 >> 62) << 6) as i32
}
fn decode_inst_operands(dec: &mut RvDecode) {
let inst = dec.inst;
dec.codec = OPCODE_DATA[dec.op as usize].codec;
match dec.codec {
RV_CODEC_NONE => {
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.rd = dec.rs1;
dec.imm = 0;
}
RV_CODEC_U => {
dec.rd = operand_rd(inst);
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.imm = operand_imm20(inst);
}
3 => {
dec.rd = operand_rd(inst);
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.imm = operand_jimm20(inst);
}
4 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_imm12(inst);
}
5 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_shamt5(inst);
}
6 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_shamt6(inst);
}
7 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_shamt7(inst);
}
8 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_csr12(inst);
}
9 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.imm = operand_simm12(inst);
}
10 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.imm = operand_sbimm12(inst);
}
11 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.imm = 0;
}
12 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.rm = operand_rm(inst);
dec.imm = 0;
}
13 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.rs3 = operand_rs3(inst);
dec.imm = 0;
dec.rm = operand_rm(inst);
}
14 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = operand_rs2(inst);
dec.imm = 0;
dec.aq = operand_aq(inst);
dec.rl = operand_rl(inst);
}
15 => {
dec.rd = operand_rd(inst);
dec.rs1 = operand_rs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = 0;
dec.aq = operand_aq(inst);
dec.rl = operand_rl(inst);
}
16 => {
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.rd = dec.rs1;
dec.pred = operand_pred(inst);
dec.succ = operand_succ(inst);
dec.imm = 0;
}
17 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = operand_crs1q(inst).wrapping_add(8);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmb(inst);
}
18 => {
dec.rs1 = operand_crs1rdq(inst).wrapping_add(8);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmi(inst);
}
19 => {
dec.rs1 = operand_crs1rdq(inst).wrapping_add(8);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmsh5(inst);
}
20 => {
dec.rs1 = operand_crs1rdq(inst).wrapping_add(8);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmsh6(inst);
}
21 => {
dec.rs1 = operand_crs1rd(inst);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmi(inst);
}
22 => {
dec.rs1 = operand_crs1rd(inst);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmsh5(inst);
}
23 => {
dec.rs1 = operand_crs1rd(inst);
dec.rd = dec.rs1;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmsh6(inst);
}
24 => {
dec.rd = RV_IREG_SP;
dec.rs1 = RV_IREG_SP;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimm16sp(inst);
}
25 => {
dec.rd = operand_crd(inst);
dec.rs1 = RV_IREG_SP;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmlwsp(inst);
}
26 => {
dec.rd = operand_crd(inst);
dec.rs1 = RV_IREG_SP;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmldsp(inst);
}
27 => {
dec.rd = operand_crd(inst);
dec.rs1 = RV_IREG_SP;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmlqsp(inst);
}
28 => {
dec.rd = operand_crd(inst);
dec.rs1 = RV_IREG_ZERO;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmi(inst);
}
29 => {
dec.rd = operand_crd(inst);
dec.rs1 = RV_IREG_ZERO;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmui(inst);
}
30 => {
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.rd = dec.rs1;
dec.imm = 0;
}
31 => {
dec.rd = operand_crdq(inst).wrapping_add(8);
dec.rs1 = RV_IREG_SP;
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimm4spn(inst);
}
32 => {
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.rd = dec.rs1;
dec.imm = operand_cimmj(inst);
}
33 => {
dec.rd = RV_IREG_RA;
dec.rs2 = RV_IREG_ZERO;
dec.rs1 = dec.rs2;
dec.imm = operand_cimmj(inst);
}
34 => {
dec.rd = operand_crdq(inst).wrapping_add(8);
dec.rs1 = operand_crs1q(inst).wrapping_add(8);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmw(inst);
}
35 => {
dec.rd = operand_crdq(inst).wrapping_add(8);
dec.rs1 = operand_crs1q(inst).wrapping_add(8);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmd(inst);
}
36 => {
dec.rd = operand_crdq(inst).wrapping_add(8);
dec.rs1 = operand_crs1q(inst).wrapping_add(8);
dec.rs2 = RV_IREG_ZERO;
dec.imm = operand_cimmq(inst);
}
37 => {
dec.rs1 = operand_crs1rd(inst);
dec.rd = dec.rs1;
dec.rs2 = operand_crs2(inst);
dec.imm = 0;
}
38 => {
dec.rd = operand_crd(inst);
dec.rs1 = operand_crs2(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = 0;
}
39 => {
dec.rd = RV_IREG_RA;
dec.rs1 = operand_crs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = 0;
}
40 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = operand_crs1(inst);
dec.rs2 = RV_IREG_ZERO;
dec.imm = 0;
}
41 => {
dec.rs1 = operand_crs1rdq(inst).wrapping_add(8);
dec.rd = dec.rs1;
dec.rs2 = operand_crs2q(inst).wrapping_add(8);
dec.imm = 0;
}
42 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = (operand_crs1q(inst)).wrapping_add(8);
dec.rs2 = (operand_crs2q(inst)).wrapping_add(8);
dec.imm = operand_cimmw(inst);
}
43 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = (operand_crs1q(inst)).wrapping_add(8);
dec.rs2 = (operand_crs2q(inst)).wrapping_add(8);
dec.imm = operand_cimmd(inst);
}
44 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = (operand_crs1q(inst)).wrapping_add(8);
dec.rs2 = (operand_crs2q(inst)).wrapping_add(8);
dec.imm = operand_cimmq(inst);
}
45 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = RV_IREG_SP;
dec.rs2 = operand_crs2(inst);
dec.imm = operand_cimmswsp(inst);
}
46 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = RV_IREG_SP;
dec.rs2 = operand_crs2(inst);
dec.imm = operand_cimmsdsp(inst);
}
47 => {
dec.rd = RV_IREG_ZERO;
dec.rs1 = RV_IREG_SP;
dec.rs2 = operand_crs2(inst);
dec.imm = operand_cimmsqsp(inst);
}
_ => {}
};
}
fn decode_inst_decompress(dec: &mut RvDecode, isa: RvIsa) {
if let Some(decomp_op) = match isa {
RvIsa::Rv32 => OPCODE_DATA[dec.op as usize].decomp_rv32,
RvIsa::Rv64 => OPCODE_DATA[dec.op as usize].decomp_rv64,
RvIsa::Rv128 => OPCODE_DATA[dec.op as usize].decomp_rv128,
} {
if OPCODE_DATA[dec.op as usize].decomp_data == RvCdImmediate::Nz && dec.imm == 0 {
dec.op = RvOp::Illegal;
} else {
dec.op = decomp_op;
dec.codec = OPCODE_DATA[decomp_op as usize].codec as u8;
}
}
}
fn check_constraints(dec: &RvDecode, constraints: &[RvcConstraint]) -> bool {
let imm = dec.imm;
let rd = dec.rd;
let rs1 = dec.rs1;
let rs2 = dec.rs2;
for c in constraints {
match *c {
RVC_RD_EQ_RA => {
if !(rd == 1) {
return false;
}
}
RVC_RD_EQ_X0 => {
if rd != 0 {
return false;
}
}
RVC_RS1_EQ_X0 => {
if rs1 != 0 {
return false;
}
}
RVC_RS2_EQ_X0 => {
if rs2 != 0 {
return false;
}
}
RVC_RS2_EQ_RS1 => {
if rs2 != rs1 {
return false;
}
}
RVC_IMM_EQ_RA => {
if rs1 != 1 {
return false;
}
}
RVC_IMM_EQ_ZERO => {
if imm != 0 {
return false;
}
}
RVC_IMM_EQ_N1 => {
if imm != -1 {
return false;
}
}
RVC_IMM_EQ_P1 => {
if imm != 1 {
return false;
}
}
RVC_CSR_EQ_0X001 => {
if imm != 0x1 {
return false;
}
}
RVC_CSR_EQ_0X002 => {
if imm != 0x2 {
return false;
}
}
RVC_CSR_EQ_0X003 => {
if imm != 0x3 {
return false;
}
}
RVC_CSR_EQ_0XC00 => {
if imm != 0xc00 {
return false;
}
}
RVC_CSR_EQ_0XC01 => {
if imm != 0xc01 {
return false;
}
}
RVC_CSR_EQ_0XC02 => {
if imm != 0xc02 {
return false;
}
}
RVC_CSR_EQ_0XC80 => {
if imm != 0xc80 {
return false;
}
}
RVC_CSR_EQ_0XC81 => {
if imm != 0xc81 {
return false;
}
}
RVC_CSR_EQ_0XC82 => {
if imm != 0xc82 {
return false;
}
}
_ => {}
}
}
return true;
}
fn decode_inst_lift_pseudo(dec: &mut RvDecode) {
for comp_data in OPCODE_DATA[dec.op as usize].pseudo {
if check_constraints(dec, comp_data.constraints) {
dec.op = comp_data.op;
dec.codec = OPCODE_DATA[dec.op as usize].codec;
return;
}
}
}
fn decode_inst_format(_tab: usize, dec: &RvDecode) {
match inst_length(dec.inst) {
2 => {
print!("{:04x} ", dec.inst & 0xffff);
}
4 => {
print!("{:08x} ", dec.inst & 0xffff_ffff);
}
6 => {
print!("{:012x}", dec.inst & 0xffff_ffff_ffff);
}
_ => {
print!("{:016x}", dec.inst);
}
}
for fmt in OPCODE_DATA[dec.op as usize].format {
match fmt {
b'O' => {
print!("{}", OPCODE_DATA[dec.op as usize].name);
}
b'(' => {
print!("(");
}
b',' => {
print!(",");
}
b')' => {
print!(")");
}
b'0' => {
print!("{}", RV_IREG_NAME_SYM[dec.rd as usize]);
}
b'1' => {
print!("{}", RV_IREG_NAME_SYM[dec.rs1 as usize]);
}
b'2' => {
print!("{}", (RV_IREG_NAME_SYM[dec.rs2 as usize]));
}
b'3' => {
print!("{}", (RV_FREG_NAME_SYM[dec.rd as usize]));
}
b'4' => {
print!("{}", (RV_FREG_NAME_SYM[dec.rs1 as usize]));
}
b'5' => {
print!("{}", (RV_FREG_NAME_SYM[dec.rs2 as usize]));
}
b'6' => {
print!("{}", (RV_FREG_NAME_SYM[dec.rs3 as usize]));
}
b'7' => {
print!("{}", dec.rs1);
}
b'i' => {
print!("{}", dec.imm);
}
b'o' => {
print!("{}", dec.imm);
print!(" ");
print!("# 0x{:x}", dec.pc.wrapping_add(dec.imm as u64));
}
b'c' => match csr_name(dec.imm & 0xfff) {
Some(name) => print!("{}", name),
None => print!("{:03x}", dec.imm & 0xfff),
},
b'r' => match dec.rm {
0 => {
print!("rne");
}
1 => {
print!("rtz");
}
2 => {
print!("rdn");
}
3 => {
print!("rup");
}
4 => {
print!("rmm");
}
7 => {
print!("dyn");
}
_ => {
print!("inv");
}
},
b'p' => {
if dec.pred & RV_FENCE_I != 0 {
print!("i");
}
if dec.pred & RV_FENCE_O != 0 {
print!("o");
}
if dec.pred & RV_FENCE_R != 0 {
print!("r");
}
if dec.pred & RV_FENCE_W != 0 {
print!("w");
}
}
b's' => {
if dec.succ & RV_FENCE_I != 0 {
print!("i");
}
if dec.succ & RV_FENCE_O != 0 {
print!("o");
}
if dec.succ & RV_FENCE_R != 0 {
print!("r");
}
if dec.succ & RV_FENCE_W != 0 {
print!("w");
}
}
b'\\t' => {
print!("\\t");
}
b'A' => {
if dec.aq != 0 {
print!(".aq");
}
}
b'R' => {
if dec.rl != 0 {
print!(".rl");
}
}
_ => {}
}
}
}
fn inst_length(inst: RvInst) -> usize {
return (if inst & 0o3 != 0o3 {
2
} else if inst & 0o34 != 0o34 {
4
} else if inst & 0o77 == 0o37 {
6
} else if inst & 0o177 == 0o77 {
8
} else {
0
}) as usize;
}
#[allow(dead_code)]
pub fn inst_fetch(data: &[u8]) -> (RvInst, usize) {
let mut inst: RvInst = (data[1] as RvInst) << 8 | data[0] as RvInst;
let length = inst_length(inst);
if length >= 8 {
inst |= (data[7] as RvInst) << 56 | (data[6] as RvInst) << 48;
}
if length >= 6 {
inst |= (data[5] as RvInst) << 40 | (data[4] as RvInst) << 32;
}
if length >= 4 {
inst |= (data[3] as RvInst) << 24 | (data[2] as RvInst) << 16;
}
(inst, length)
}
pub fn disasm_inst(isa: RvIsa, pc: u64, inst: RvInst) {
let mut dec = RvDecode {
pc,
inst,
imm: 0,
op: RvOp::Illegal,
codec: 0,
rd: 0,
rs1: 0,
rs2: 0,
rs3: 0,
rm: 0,
pred: 0,
succ: 0,
aq: 0,
rl: 0,
};
decode_inst_opcode(&mut dec, isa);
decode_inst_operands(&mut dec);
decode_inst_decompress(&mut dec, isa);
decode_inst_lift_pseudo(&mut dec);
decode_inst_format(32, &dec);
}
Served by rngit 1.4.0 - Generated in 0.11s